<html xmlns="https://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Content-Language" content="zh-CN" />
<link href="../style/css/manual-zip.css" rel="stylesheet" media="all" type="text/css" title="Main stylesheet" />
<link href="../style/css/manual-zip-100pc.css" rel="alternate stylesheet" media="all" type="text/css" title="No Sidebar - Default font size" />
<link href="../style/css/manual-print.css" rel="stylesheet" media="print" type="text/css" />
<title>mod_isapi － Apache 2.2 中文手册 [金步国]</title>
<script> var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?d286c55b63a3c54a1e43d10d4c203e75"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script>
</head>
<body><div id="page-header">
<p class="menu"><a href="index.html">模块索引</a> | <a href="directives.html">指令索引</a> | <a href="../faq/index.html">常见问题</a> | <a href="../glossary.html">词汇表</a> | <a href="../sitemap.html">站点导航</a></p><p class="apache">Apache HTTP Server 版本2.2</p><img alt="" src="../images/feather.gif" /></div>
<div class="up"><a href="index.html"><img title="&lt;-" alt="&lt;-" src="../images/left.gif" /></a></div>
<div id="path"><a href="https://www.apache.org/">Apache</a> &gt; <a href="https://httpd.apache.org/">HTTP Server</a> &gt; <a href="https://httpd.apache.org/docs/">文档</a> &gt; <a href="../index.html">版本2.2</a> &gt; <a href="index.html">模块</a></div>

<div id="translation-info">　　 <a href="../translator_announcement.html#thanks">致谢</a> | 本篇译者：<a href="../../../index.html">金步国</a>(<a href="../../../index.html">作品集</a>) | 本页最后更新：2006年10月20日</div>
<div id="page-content"><div id="preamble"><h1>Apache模块 mod_isapi</h1>

<table border="1" cellpadding="0" cellspacing="0" bordercolor="#AAAAAA" class="module">
<tr><th><a href="module-dict.html#Description">说明</a></th><td>仅限于在Windows平台上实现ISAPI扩展</td></tr>
<tr><th><a href="module-dict.html#Status">状态</a></th><td>基本(B)</td></tr>
<tr><th><a href="module-dict.html#ModuleIdentifier">模块名</a></th><td>isapi_module</td></tr>
<tr><th><a href="module-dict.html#SourceFile">源文件</a></th><td>mod_isapi.c</td></tr>
<tr><th><a href="module-dict.html#Compatibility">兼容性</a></th><td>仅用于Win32</td></tr>
</table>
<h3>概述</h3>

    <p>本模块实现了互联网服务扩展应用程序编程接口(Internet Server extension API)。本模块使得Windows上的Apache能有限地实现互联网服务扩展(比如调用ISAPI的动态连接库)。</p>

    <p>ISAPI扩展模块(.dll文件)是由第三方开发的。Apache开发组没有编写这些模块，因此我们也不对它们提供支持。如果在运行ISAPI扩展过程中发生问题，请直接与ISAPI的作者联系。<strong>请<em>不要</em>将此类问题贴在Apache的邮件列表或错误反馈页面上</strong>。</p>
</div>
<div class="top"><a href="mod_isapi.html#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="section">
<h2><a name="usage" id="usage">用法</a></h2>

    <p>在服务器配置文件中，使用<code class="directive"><a href="mod_mime.html#addhandler">AddHandler</a></code>指令将<code>isapi-isa</code>处理器与ISAPI文件关联起来，并通过文件扩展名来建议对应关系。要将任何一个.dll文件作为ISAPI扩展来处理，需要编辑httpd.conf文件，并加入以下行：</p>
    <div class="example"><p><code>
        AddHandler isapi-isa .dll
    </code></p></div>

    <p>Apache服务器不允许将服务于请求的模块动态地加载，但可以通过在httpd.conf文件中，加入以下语句使一个模块在Apache启动时预先载入系统，并使其驻留在系统中：</p>
    <div class="example"><p><code>
        ISAPICacheFile c:/WebWork/Scripts/ISAPI/mytest.dll
    </code></p></div>

    <p>无论是否预载一个ISAPI扩展，所有的ISAPI扩展都使用与CGI脚本相同的许可限制来管理。也就是说，包含ISAPI动态连接库的目录必须要设置"<code class="directive"><a href="core.html#options">Options</a></code> <code>ExecCGI</code>"。</p>

    <p>请参阅<a href="mod_isapi.html#notes">附加注释</a>和<a href="mod_isapi.html#journal">程序员注记</a>以得到关于<code class="module"><a href="mod_isapi.html">mod_isapi</a></code>所提供的特定的ISAPI支持的细节内容。</p>
</div><div class="top"><a href="mod_isapi.html#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="section">
<h2><a name="notes" id="notes">附加注释</a></h2>

    <p>Apache的ISAPI实现了除部分用来处理异步I/O的微软特定(Microsoft-specific)扩展以外的所有ISAPI 2.0规范。Apache的I/O模型不允许使用ISAPI可能用到的异步读写方式。如果ISAPI试图调用不支持的功能，包括异步I/O，在错误日志中会显示一条错误信息以方便系统的调试。由于这类错误信息可能会大量地产生，指令"<code>ISAPILogNotSupported Off</code>"可以使这类错误信息不被记录。</p>

    <p>在某些服务器上，比如微软的IIS，ISAPI扩展在载入后将驻留在服务器上，直到内存占用过高，或是指定了不同的配置选项。Apache目前在每次请求时，都会加载和卸载特定的ISAPI扩展，除非指定了<code class="directive"><a href="mod_isapi.html#isapicachefile">ISAPICacheFile</a></code>指令。虽然这样看来是效率很低的一种做法，但根据Apache的内存模式使用这种方式是最有效的。许多ISAPI模块与Apache服务器有细微的兼容性问题，卸载这些模块可以保证服务器的稳定运行。</p>

    <p>同时请记住Apache支持ISAPI扩展，但它<strong>不支持ISAPI过滤器</strong>。对于ISAPI过滤器的支持可能会在晚些时候加入，但目前没有支持这一功能的计划。</p>
</div><div class="top"><a href="mod_isapi.html#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="section">
<h2><a name="journal" id="journal">程序员注记</a></h2>

    <p>如果你正在开发 Apache 2.0 <code class="module"><a href="mod_isapi.html">mod_isapi</a></code>模块，你必须严格按照以下指令的限制来调用<code>ServerSupportFunction</code> ：</p>

    <dl>
      <dt><code>HSE_REQ_SEND_URL_REDIRECT_RESP</code></dt>
      <dd>重定向用户到其它的位置。必须使用完整的、合法的URL(比如：<code>http://server/location</code>)。</dd>

      <dt><code>HSE_REQ_SEND_URL</code></dt>
      <dd>重定向用户到其它的位置。这里不能使用一个完整的URL，你不可以传入协议或服务器名(例如：<code>/location</code>)。这类重定向由服务器来处理，不是浏览器。
      <div class="warning"><h3>警告</h3>
        <p>在最近发布的文档中，微软已经试图放弃这两个<code>HSE_REQ_SEND_URL</code>函数的差别。但Apache还是将它们视为两个不同的函数加以不同的实现。</p>
      </div></dd>

      <dt><code>HSE_REQ_SEND_RESPONSE_HEADER</code></dt>
      <dd>如果在请求头字符串变量中，请求头的内容后面紧跟一个空行(两个连续的换行)，然后再加上请求体的内容，Apache能接受这一相应的请求体。因为请求头变量是以NULL结束的，这个请求体里不能包含NULL。</dd>

      <dt><code>HSE_REQ_DONE_WITH_SESSION</code></dt>
      <dd>Apache认为这是一个空操作，因为当ISAPI处理返回时，会话就结束了。</dd>

      <dt><code>HSE_REQ_MAP_URL_TO_PATH</code></dt>
      <dd>Apache将虚拟名字转换为物理名字。</dd>

      <dt><code>HSE_APPEND_LOG_PARAMETER</code></dt>
      <dd>这一日志信息可以在以下任一地方捕获：
        <ul>
          <li>在<code class="directive"><a href="mod_log_config.html#customlog">CustomLog</a></code>指令中的 <code>\"%{isapi-parameter}n\"</code> 元素里</li>
          <li>在"<code class="directive"><a href="mod_isapi.html#isapiappendlogtoquery">ISAPIAppendLogToQuery</a></code> <code>On</code>"指令中的"<code>%q</code>"日志元素里</li>
          <li>由"<code class="directive"><a href="mod_isapi.html#isapiappendlogtoerrors">ISAPIAppendLogToErrors</a></code> <code>On</code>"指令所产生的错误日志中</li>
        </ul>
        <p>第一行的 <code>%{isapi-parameter}n</code> 元素总是可用的，并且是推荐的。</p>
      </dd>

      <dt><code>HSE_REQ_IS_KEEP_CONN</code></dt>
      <dd>返回Keep-Alive的协商状态。</dd>

      <dt><code>HSE_REQ_SEND_RESPONSE_HEADER_EX</code></dt>
      <dd>即使<code>fKeepConn</code>标志被忽略，还是按有证书的方式来处理。</dd>

      <dt><code>HSE_REQ_IS_CONNECTED</code></dt>
      <dd>如果请求退出则报告错误。</dd>
    </dl>

    <p>对于所有不支持的<code>ServerSupportFunction</code>调用，Apache返回<code>FALSE</code> ，同时将<code>GetLastError</code>的值置为<code>ERROR_INVALID_PARAMETER</code> 。</p>

    <p><code>ReadClient</code>越过初始缓冲区(由<code class="directive"><a href="mod_isapi.html#isapireadaheadbuffer">ISAPIReadAheadBuffer</a></code>指令定义)得到请求的数据包。根据<code class="directive">ISAPIReadAheadBuffer</code>(在调用ISAPI处理前缓冲的数据字节数)的设定，较小的请求包当请求被调用时，直接完全地传送到ISAPI扩展。如果请求包很长，ISAPI扩展必须使用<code>ReadClient</code>得到剩下的请求数据。</p>

    <p>支持<code>WriteClient</code> ，但只能使用<code>HSE_IO_SYNC</code>标志或不带标志("<code>0</code>"值)。任何其它的<code>WriteClient</code>请求会被拒绝，并且返回<code>FALSE</code> ，同时<code>GetLastError</code>的值被置为<code>ERROR_INVALID_PARAMETER</code> 。</p>

    <p>支持<code>GetServerVariable</code> ，虽然扩展服务变量不存在(定义在其它服务器上)。包括<code>ALL_HTTP</code>和<code>ALL_RAW</code> ，所有的常规Apache CGI环境变量都可以通过<code>GetServerVariable</code>得到。</p>

    <p>Apache 2.0 <code class="module"><a href="mod_isapi.html">mod_isapi</a></code>支持后来版本的ISAPI规范中的新增功能，比如对异步I/O的有限仿真及<code>TransmitFile</code>语义。Apache同时也支持ISAPI .dlls 的预载入以提高性能，以上这些在 Apache1.3 <code>mod_isapi</code>都没有实现。</p>
</div>
<div class="top"><a href="mod_isapi.html#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="directive-section"><h2><a name="ISAPIAppendLogToErrors" id="ISAPIAppendLogToErrors">ISAPIAppendLogToErrors</a> <a name="isapiappendlogtoerrors" id="isapiappendlogtoerrors">指令</a></h2>
<table border="1" cellpadding="0" cellspacing="0" bordercolor="#AAAAAA" class="directive">
<tr><th><a href="directive-dict.html#Description">说明</a></th><td>把ISAPI扩展的<code>HSE_APPEND_LOG_PARAMETER</code>请求记录在错误日志中</td></tr>
<tr><th><a href="directive-dict.html#Syntax">语法</a></th><td><code>ISAPIAppendLogToErrors on|off</code></td></tr>
<tr><th><a href="directive-dict.html#Default">默认值</a></th><td><code>ISAPIAppendLogToErrors off</code></td></tr>
<tr><th><a href="directive-dict.html#Context">作用域</a></th><td>server config, virtual host, directory, .htaccess</td></tr>
<tr><th><a href="directive-dict.html#Override">覆盖项</a></th><td>FileInfo</td></tr>
<tr><th><a href="directive-dict.html#Status">状态</a></th><td>基本(B)</td></tr>
<tr><th><a href="directive-dict.html#Module">模块</a></th><td>mod_isapi</td></tr>
</table>
    <p>把ISAPI扩展的<code>HSE_APPEND_LOG_PARAMETER</code>请求记录在错误日志中</p>

</div>
<div class="top"><a href="mod_isapi.html#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="directive-section"><h2><a name="ISAPIAppendLogToQuery" id="ISAPIAppendLogToQuery">ISAPIAppendLogToQuery</a> <a name="isapiappendlogtoquery" id="isapiappendlogtoquery">指令</a></h2>
<table border="1" cellpadding="0" cellspacing="0" bordercolor="#AAAAAA" class="directive">
<tr><th><a href="directive-dict.html#Description">说明</a></th><td>把ISAPI扩展的<code>HSE_APPEND_LOG_PARAMETER</code>请求记录在查询域中</td></tr>
<tr><th><a href="directive-dict.html#Syntax">语法</a></th><td><code>ISAPIAppendLogToQuery on|off</code></td></tr>
<tr><th><a href="directive-dict.html#Default">默认值</a></th><td><code>ISAPIAppendLogToQuery on</code></td></tr>
<tr><th><a href="directive-dict.html#Context">作用域</a></th><td>server config, virtual host, directory, .htaccess</td></tr>
<tr><th><a href="directive-dict.html#Override">覆盖项</a></th><td>FileInfo</td></tr>
<tr><th><a href="directive-dict.html#Status">状态</a></th><td>基本(B)</td></tr>
<tr><th><a href="directive-dict.html#Module">模块</a></th><td>mod_isapi</td></tr>
</table>
    <p>把ISAPI扩展的<code>HSE_APPEND_LOG_PARAMETER</code>请求记录在查询域中(追加在<code class="directive"><a href="mod_log_config.html#customlog">CustomLog</a></code> <code>%q</code>元素后面)。</p>

</div>
<div class="top"><a href="mod_isapi.html#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="directive-section"><h2><a name="ISAPICacheFile" id="ISAPICacheFile">ISAPICacheFile</a> <a name="isapicachefile" id="isapicachefile">指令</a></h2>
<table border="1" cellpadding="0" cellspacing="0" bordercolor="#AAAAAA" class="directive">
<tr><th><a href="directive-dict.html#Description">说明</a></th><td>启动时载入的ISAPI动态连接库</td></tr>
<tr><th><a href="directive-dict.html#Syntax">语法</a></th><td><code>ISAPICacheFile <var>file-path</var> [<var>file-path</var>] ...</code></td></tr>
<tr><th><a href="directive-dict.html#Context">作用域</a></th><td>server config, virtual host</td></tr>
<tr><th><a href="directive-dict.html#Status">状态</a></th><td>基本(B)</td></tr>
<tr><th><a href="directive-dict.html#Module">模块</a></th><td>mod_isapi</td></tr>
</table>
    <p>指定一个需在Apache服务启动的时候载入的以空格分隔的文件列表，这些文件驻留在系统中直至服务器关闭。本指令可以为每个需要的ISAPI动态连接库文件所重复。应指定每个文件的路径。如果不是绝对路径，则会基于<code class="directive"><a href="core.html#serverroot">ServerRoot</a></code>来处理相对路径。</p>

</div>
<div class="top"><a href="mod_isapi.html#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="directive-section"><h2><a name="ISAPIFakeAsync" id="ISAPIFakeAsync">ISAPIFakeAsync</a> <a name="isapifakeasync" id="isapifakeasync">指令</a></h2>
<table border="1" cellpadding="0" cellspacing="0" bordercolor="#AAAAAA" class="directive">
<tr><th><a href="directive-dict.html#Description">说明</a></th><td>为ISAPI回调模拟异步支持</td></tr>
<tr><th><a href="directive-dict.html#Syntax">语法</a></th><td><code>ISAPIFakeAsync on|off</code></td></tr>
<tr><th><a href="directive-dict.html#Default">默认值</a></th><td><code>ISAPIFakeAsync off</code></td></tr>
<tr><th><a href="directive-dict.html#Context">作用域</a></th><td>server config, virtual host, directory, .htaccess</td></tr>
<tr><th><a href="directive-dict.html#Override">覆盖项</a></th><td>FileInfo</td></tr>
<tr><th><a href="directive-dict.html#Status">状态</a></th><td>基本(B)</td></tr>
<tr><th><a href="directive-dict.html#Module">模块</a></th><td>mod_isapi</td></tr>
</table>
    <p>当设为on时，模拟ISAPI回调的异步支持。</p>

</div>
<div class="top"><a href="mod_isapi.html#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="directive-section"><h2><a name="ISAPILogNotSupported" id="ISAPILogNotSupported">ISAPILogNotSupported</a> <a name="isapilognotsupported" id="isapilognotsupported">指令</a></h2>
<table border="1" cellpadding="0" cellspacing="0" bordercolor="#AAAAAA" class="directive">
<tr><th><a href="directive-dict.html#Description">说明</a></th><td>记录ISAPI不支持的功能调用</td></tr>
<tr><th><a href="directive-dict.html#Syntax">语法</a></th><td><code>ISAPILogNotSupported on|off</code></td></tr>
<tr><th><a href="directive-dict.html#Default">默认值</a></th><td><code>ISAPILogNotSupported off</code></td></tr>
<tr><th><a href="directive-dict.html#Context">作用域</a></th><td>server config, virtual host, directory, .htaccess</td></tr>
<tr><th><a href="directive-dict.html#Override">覆盖项</a></th><td>FileInfo</td></tr>
<tr><th><a href="directive-dict.html#Status">状态</a></th><td>基本(B)</td></tr>
<tr><th><a href="directive-dict.html#Module">模块</a></th><td>mod_isapi</td></tr>
</table>
    <p>在服务错误日志中记录所有ISAPI扩展不支持的请求。本指令可以帮助系统管理员跟踪错误。把这个指令定义为on以后，如果所有的ISAPI模块都工作良好，应该把它设回为Off。</p>

</div>
<div class="top"><a href="mod_isapi.html#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="directive-section"><h2><a name="ISAPIReadAheadBuffer" id="ISAPIReadAheadBuffer">ISAPIReadAheadBuffer</a> <a name="isapireadaheadbuffer" id="isapireadaheadbuffer">指令</a></h2>
<table border="1" cellpadding="0" cellspacing="0" bordercolor="#AAAAAA" class="directive">
<tr><th><a href="directive-dict.html#Description">说明</a></th><td>传送到ISAPI扩展的预读缓冲区大小</td></tr>
<tr><th><a href="directive-dict.html#Syntax">语法</a></th><td><code>ISAPIReadAheadBuffer <var>size</var></code></td></tr>
<tr><th><a href="directive-dict.html#Default">默认值</a></th><td><code>ISAPIReadAheadBuffer 49152</code></td></tr>
<tr><th><a href="directive-dict.html#Context">作用域</a></th><td>server config, virtual host, directory, .htaccess</td></tr>
<tr><th><a href="directive-dict.html#Override">覆盖项</a></th><td>FileInfo</td></tr>
<tr><th><a href="directive-dict.html#Status">状态</a></th><td>基本(B)</td></tr>
<tr><th><a href="directive-dict.html#Module">模块</a></th><td>mod_isapi</td></tr>
</table>
    <p>定义初始调用时传送到ISAPI扩展的最大预读缓冲区大小。所有其它的数据必须通过<code>ReadClient</code>回调功能得到；部分ISAPI扩展可能不支持<code>ReadClient</code>功能。请参考ISAPI扩展本身对相关问题描述。</p>

</div>
</div>
<div id="footer">
<p class="apache">本文允许自由的转载、引用、再分发，但必须保留译者署名并注明出处；详见：<a href="../translator_announcement.html#announcement">版权声明</a>。</p>
<p class="menu"><a href="index.html">模块索引</a> | <a href="directives.html">指令索引</a> | <a href="../faq/index.html">常见问题</a> | <a href="../glossary.html">词汇表</a> | <a href="../sitemap.html">站点导航</a></p></div>
</body></html>
